import type { AxiosError, AxiosRequestConfig, AxiosResponse } from "axios";
import { Notify } from 'quasar'
// import {router} from '@/router'
import { storeToRefs } from 'pinia';
import { userStore } from '../store/user.ts';

import axios from "axios";
import { AxiosInstance } from "axios";
const service: AxiosInstance = axios.create({
    baseURL: "http://127.0.0.1:5000",
    timeout: 10000,
});

const userstore = userStore();
const { userInfo } = storeToRefs(userstore);

interface req {
    url: string,
    method: string,
    data: object
    headers: object,
    withCredentials?: boolean
}

service.interceptors.request.use(
    (config: AxiosRequestConfig) => {
        //给请求头设置token
        // if (token) {
        //   config.headers!.Authorization = `baseUrl ${token}`;
        // }
        console.log(userInfo.value.token)
        const token = userInfo.value.token
        if (token !== "") {
            // 3. 设置token
            config.headers.token = token
        }
        return config;
    },
    (error: AxiosError) => {
        Notify.create({
            type: 'negative',
            message: error.message,
            position: "top"
        })
        // ElMessage.error();
        return Promise.reject(error);
    }
);

/* 响应拦截器 */
service.interceptors.response.use(
    (response: AxiosResponse) => {
        // console.log(response.data.data)
        const { msg } = response.data; // 根据自定义错误码判断请求是否成功
        if (response.status >= 200 && response.status <= 400) {
            // 将组件用的数据返回
            return response.data;
        } else {
            // 处理业务错误。
            Notify.create({
                type: 'negative',
                message: msg,
                position: "top"
            })
            // ElMessage.error(msg);
            return Promise.reject(new Error(msg));
        }
    },
    (error: AxiosError) => {
        // 处理 HTTP 网络错误
        let message = "";
        // HTTP 状态码
        const status = error.response?.status;
        switch (status) {
            case 401:
                message = "token失效，请重新登录";
                // 这里可以触发退出的 action
                // router.push('/login')
                // store.dispatch("Logout").then(() => {
                //     router.push("/login");
                // });
                break;
            case 403:
                message = "服务器拒绝授权访问";
                break;
            case 404:
                message = "页面不存在";
                break;
            case 500:
                message = "服务器故障";
                // store.dispatch("Logout").then(() => {
                //     router.push("/login");
                // });
                break;
            case 502:
                message = "数据库查询错误";
                break;
            default:
                message = "网络连接错误";
                // store.dispatch("Logout").then(() => {
                //     router.push("/login");
                // });
                break;
        }
        if (error.response && error.response.data && error.response.data.msg){
            message = error.response.data.msg
        }
        // console.log(error, 123)
        Notify.create({
            type: 'negative',
            message: message,
            position: "top"
        })
        // ElMessage.error(message);
        return Promise.reject(error);
    }
);


export default (payload: req) => {
    // 负责发请求: 请求地址, 请求方式, 提交的数据
    const {url, method, data, headers, withCredentials} = payload
    // console.log(payload)
    // @ts-ignore
    return service({
        url,
        method,
        // 如果是get请求, 使用params传递参数
        // 如果是不是get请求, 使用data传递参数
        // 中括号中的是js表达式
        // const a = { name: 100 }  可以 a.name 取值 , 也可以 a[ 10>9 ? 'name' : 'age ]
        [method.toLowerCase() === 'get' ? 'params' : 'data']: data,
        headers, withCredentials
    })
}